package com.woniuxy.automotivemanagementsystem.interceptor;


import com.fasterxml.jackson.databind.ObjectMapper;
import com.woniuxy.automotivemanagementsystem.entity.User;
import com.woniuxy.automotivemanagementsystem.utils.JWT.JwtUtil;
import com.woniuxy.automotivemanagementsystem.utils.JWT.TokenEnum;
import com.woniuxy.automotivemanagementsystem.utils.Result;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * 用户身份认证拦截器
 */
@Component
public class AuthenticationInterceptor implements HandlerInterceptor {

    /**
     * 执行controller中方法之前，对当前用户身份进行校验(判断当前用户是否已登录)
     *  通过获取请求中携带 token 进行判断
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //处理响应中文乱码
        response.setContentType("application/json;charset=utf-8");
        //获取请求中URL
        String uri = request.getRequestURI();
//        System.out.println("uri : " + uri);
        //获取请求中携带token头
        String token = request.getHeader("token");
//        System.out.println("token =>" + token);

        //创建Result 对象，封装响应数据
        Result result = Result.error("false");
        //创建ObjectMapper对象，把实体对象或者集合转换成json串
        ObjectMapper mapper = new ObjectMapper();
        //判断token是否有值
        if(token != null && !token.trim().isEmpty()) { //表示用户登录过
            //1.判断是否合法，返回一个枚举对象
            TokenEnum tokenEnum = JwtUtil.verifyToken(token);
            //2.判断token是否正确
            if(TokenEnum.TOKENSUCCESS == tokenEnum) { //表示当前token合法
                //获取token过期时间
                //获取当前token中用户信息
                Long id = JwtUtil.getId(token);
                String username = JwtUtil.getUsername(token);
                //重新生成token响应给前端
                String newToken = JwtUtil.generateToken(new User(id.intValue(), username));
                //设置响应头信息
                //将token放进响应头中
                response.setHeader("token",newToken);
                //前后端分离的项目，必须暴露响应头，否则前端收不到响应头
                response.setHeader("Access-Control-Expose-Headers","token");
                return true;//放行
            }else if(TokenEnum.TOKENEXPIRE == tokenEnum){ //表示token已过期
                //响应json数据异常信息给前端
                result.code(525).message("你的token已过期");
                //把result对象转换成json字符串
                String responseStr = mapper.writeValueAsString(result);
                //通过response对象响应给前读研
                response.getWriter().write(responseStr);
                return false;
            }else { //表示非法token
                //响应json数据异常信息给前端
                result.code(526).message("非法token");
                //把result对象转换成json字符串
                String responseStr = mapper.writeValueAsString(result);
                //通过response对象响应给前读研
                response.getWriter().write(responseStr);
                return false;
            }
        }else { //表示用户未登录
            //响应json数据异常信息给前端
            result.code(527).message("请求中未携带token");
            //把result对象转换成json字符串
            String responseStr = mapper.writeValueAsString(result);
            //通过response对象响应给前读研
            response.getWriter().write(responseStr);
            return false; //拦截
        }
    }
}
